//
// Created by twetec on 25-7-13.
//

#ifndef NETWORK_PROBER_PROBE_HANDLE_TCP_PROBE_TASK_H
#define NETWORK_PROBER_PROBE_HANDLE_TCP_PROBE_TASK_H

#include <coroutine>

#include <network_prober/database/memory_db_holder.h>
#include <network_prober/database/file_db_holder.h>

namespace network_prober::probe
{
// /**
//  * TCP IPv4
//  */
// class TCPProbeIPv4 : public std::enable_shared_from_this<TCPProbeIPv4>
// {
// public:
//     /**
//      *  探测
//      */
//     void probe();
//
//     /**
//      * 探测到时回调
//      */
//     void setOnProbedCallback(std::function<void(std::int64_t)> callback);
//
//     /**
//      * @param interface 网口地址
//      * @param target 目标地址
//      */
//     TCPProbeIPv4(const std::string& interface, const std::string& target, const std::uint32_t& port);
//     ~TCPProbeIPv4();
//
// private:
//     std::string m_interface;
//     std::string m_target{};
//     std::uint32_t m_port;
//     asio2::tcp_client m_TCPClient;
//     std::function<void(std::int64_t)> m_onProbedCallback;
//     std::chrono::time_point<std::chrono::steady_clock> m_probeStartTime;
// };

/**
 *  观测处理
 */
class HandleTCPProbeIPv4Awaiter
{
public:
    HandleTCPProbeIPv4Awaiter(const database::ProbeTaskModel& probeTask);

    /**
     * 任务是否需要执行await_suspend()
     * @return false 表示未准备好，需要暂停
     */
    bool await_ready();

    /**
     *  在协程暂停后，执行的方法
     * @param handle 协程promise对象句柄
     */
    void await_suspend(std::coroutine_handle<> handle);

    /**
     *  co_await 输出的值
     *  这里用于返回延迟的时间
     */
    std::int64_t await_resume();

private:
    std::string m_interface;
    std::string m_target;
    std::uint32_t m_port;
    std::int64_t m_delay{-1};
};


/**
 * TCP IPv4
 */
// class TCPProbeIPv6 : public std::enable_shared_from_this<TCPProbeIPv6>
// {
// public:
//     /**
//      *  探测
//      */
//     void probe();
//
//     /**
//      * 探测到时回调
//      */
//     void setOnProbedCallback(std::function<void(std::int64_t)> callback);
//
//     /**
//      * @param interface 网口地址
//      * @param target 目标地址
//      */
//     TCPProbeIPv6(const std::string& interface, const std::string& target, const std::uint32_t& port);
//     ~TCPProbeIPv6();
//
// private:
//     std::string m_interface;
//     std::string m_target{};
//     std::uint32_t m_port;
//     asio2::tcp_client m_TCPClient;
//     std::function<void(std::int64_t)> m_onProbedCallback;
//     std::chrono::time_point<std::chrono::steady_clock> m_probeStartTime;
// };

/**
 *  观测处理
 */
class HandleTCPProbeIPv6Awaiter
{
public:
    HandleTCPProbeIPv6Awaiter(const database::ProbeTaskModel& probeTask);

    /**
     * 任务是否需要执行await_suspend()
     * @return false 表示未准备好，需要暂停
     */
    bool await_ready();

    /**
     *  在协程暂停后，执行的方法
     * @param handle 协程promise对象句柄
     */
    void await_suspend(std::coroutine_handle<> handle);

    /**
     *  co_await 输出的值
     *  这里用于返回延迟的时间
     */
    std::int64_t await_resume();

private:
    std::string m_interface;
    std::string m_target;
    std::uint32_t m_port;
    std::int64_t m_delay{-1};
};


}



#endif //NETWORK_PROBER_PROBE_HANDLE_TCP_PROBE_TASK_H
